﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Transactions;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using DotNetOpenAuth.AspNet;
using Microsoft.Web.WebPages.OAuth;
using WebMatrix.WebData;
using SIGCBI.WebMVC4.Filters;
using SIGCBI.WebMVC4.Models;

using Microsoft.Practices.Unity;
using SIGCBI.BusinessLogic;

namespace SIGCBI.WebMVC4.Controllers
{
    public class RolController : Controller
    {
        [Dependency]
        public IUserBL userBL { get; set; }

        [Dependency]
        public IUserProfileBL userProfileBL { get; set; }

        [AllowAnonymous]
        public ActionResult Register()
        {
            return View();
        }

        [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public ActionResult Register(RegisterModel model)
        {
            var allUsers = userProfileBL.GetAllFromUserProfileByNombre("");
            string[] userArray = new string[allUsers.Count];
            int i = 0;
            foreach (var item in allUsers)
            {
                userArray[i++] = item.UserName;
            }
            ViewBag.AllUsers = userArray;

            SelectList list = new SelectList(Roles.GetAllRoles());
            ViewBag.Roles = list;

            if (ModelState.IsValid)
            {
                // Intento de registrar al usuario
                try
                {
                    WebSecurity.CreateUserAndAccount(model.UserName, model.Password);
                    ViewBag.ResultMessage = "Usuario creado correctamente!";
                    return View("RoleAddToUser");
                }
                catch (MembershipCreateUserException e)
                {
                    ModelState.AddModelError("", ErrorCodeToString(e.StatusCode));
                }
            }

            // Si llegamos a este punto, es que se ha producido un error y volvemos a mostrar el formulario
            //return View(model);

            return View("RoleAddToUser");
        }

        public ActionResult RoleAddToUser()
        {
            SelectList list = new SelectList(Roles.GetAllRoles());
            ViewBag.Roles = list;

            var allUsers = userProfileBL.GetAllFromUserProfileByNombre("");
            string[] userArray = new string[allUsers.Count];
            int i = 0;
            foreach (var item in allUsers)
            {
                userArray[i++] = item.UserName;
            }
            ViewBag.AllUsers = userArray;

            return View();
        }


        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult RoleAddToUser(string RoleName, string UserName)
        {
            var userProfile = userProfileBL.GetOneUserProfileByUserName(UserName);
            if (userProfile != null)
            {
                if (userProfile.UserId == 1)
                {
                    ViewBag.ResultMessage = "No se puede modificar el usuario Administrador!";
                }

                else if (Roles.IsUserInRole(UserName, RoleName))
                {
                    ViewBag.ResultMessage = "Este Usuario ya cuenta con el Rol especificado!";
                }
                else
                {
                    try
                    {
                        userBL.RegistraRolaUsuario(UserName, RoleName);

                        ViewBag.ResultMessage = "Usuario agregado a Rol correctamente!";
                    }
                    catch
                    {
                        ViewBag.ResultMessage = "Asegure de ingresar un nombre de usuario valido!";
                    }
                }
            }
            else
            {
                ViewBag.ResultMessage = "Nombre de usuario incorrecto.";
            }

            var allUsers = userProfileBL.GetAllFromUserProfileByNombre("");
            string[] userArray = new string[allUsers.Count];
            int i = 0;
            foreach (var item in allUsers)
            {
                userArray[i++] = item.UserName;
            }
            ViewBag.AllUsers = userArray;

            SelectList list = new SelectList(Roles.GetAllRoles());
            ViewBag.Roles = list;
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult GetRoles(string UserName)
        {
            if (!string.IsNullOrWhiteSpace(UserName))
            {
                try
                {
                    var rolesforuser = Roles.GetRolesForUser(UserName);

                    if (rolesforuser != null)
                    {
                        ViewBag.RolesForThisUser = rolesforuser;
                    }
                    else
                    {
                        ViewBag.ResultMessage = "Este usuario no cuenta con ningun Rol!";
                    }

                }
                catch
                {
                    ViewBag.ResultMessage = "Nombre de usuario incorrecto!";
                }
                SelectList list = new SelectList(Roles.GetAllRoles());
                ViewBag.Roles = list;


            }

            var allUsers = userProfileBL.GetAllFromUserProfileByNombre("");
            string[] userArray = new string[allUsers.Count];
            int i = 0;
            foreach (var item in allUsers)
            {
                userArray[i++] = item.UserName;
            }
            ViewBag.AllUsers = userArray;

            return View("RoleAddToUser");
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult GetUsers(string NameUser)
        {
            if (!string.IsNullOrWhiteSpace(NameUser))
            {
                var allUsers = userProfileBL.GetAllFromUserProfileByNombre(NameUser);

                string[] userArray = new string[allUsers.Count];

                int i = 0;

                foreach (var item in allUsers)
                {
                    userArray[i++] = item.UserName;
                }

                ViewBag.AllUsers = userArray;
            }

            else
            {
                var allUsers = userProfileBL.GetAllFromUserProfileByNombre("");

                string[] userArray = new string[allUsers.Count];

                int i = 0;

                foreach (var item in allUsers)
                {
                    userArray[i++] = item.UserName;
                }

                ViewBag.AllUsers = userArray;
            }
            SelectList list = new SelectList(Roles.GetAllRoles());
            ViewBag.Roles = list;

            return View("RoleAddToUser");
        }


        public ActionResult UsuarioDelete(string UserName)
        {

            var currUser = userProfileBL.GetOneUserProfileByUserName(UserName);
            if (currUser != null)
            {

                if (currUser.UserId != 1)
                {
                    userProfileBL.RemoveUserProfile(currUser.UserId);
                    ViewBag.ResultMessage = "Usuario eliminado correctamente!";
                }
                else
                {
                    ViewBag.ResultMessage = "No puede eliminar el usuario ADMINISTRADOR!";
                }
            }
            else
            {
                ViewBag.ResultMessage = "Nombre de usuario incorrecto.";
            }

            SelectList list = new SelectList(Roles.GetAllRoles());
            ViewBag.Roles = list;

            var allUsers = userProfileBL.GetAllFromUserProfileByNombre("");
            string[] userArray = new string[allUsers.Count];
            int i = 0;
            foreach (var item in allUsers)
            {
                userArray[i++] = item.UserName;
            }
            ViewBag.AllUsers = userArray;

            return View("RoleAddToUser");
        }

        public ActionResult DeleteRoleForUser()
        {
            var allUsers = userProfileBL.GetAllFromUserProfileByNombre("");
            string[] userArray = new string[allUsers.Count];
            int i = 0;
            foreach (var item in allUsers)
            {
                userArray[i++] = item.UserName;
            }
            ViewBag.AllUsers = userArray;

            SelectList list = new SelectList(Roles.GetAllRoles());
            ViewBag.Roles = list;
            return View();
        }

        [HttpPost]
        [ValidateAntiForgeryToken]
        public ActionResult DeleteRoleForUser(string UserName, string RoleName)
        {
            var userProfile = userProfileBL.GetOneUserProfileByUserName(UserName);

            if (userProfile != null)
            {
                if (userProfile.UserId == 1)
                {
                    ViewBag.ResultMessage = "No se puede modificar el usuario Administrador!";
                }

                else if (Roles.IsUserInRole(UserName, RoleName))
                {
                    Roles.RemoveUserFromRole(UserName, RoleName);
                    ViewBag.ResultMessage = "Rol quitado a Usuario correctamente!";
                }
                else
                {
                    ViewBag.ResultMessage = "Este usuario no cuenta con el Rol seleccionado.";
                }
            }
            else
            {
                ViewBag.ResultMessage = "Nombre de usuario incorrecto.";
            }


            var allUsers = userProfileBL.GetAllFromUserProfileByNombre("");
            string[] userArray = new string[allUsers.Count];
            int i = 0;
            foreach (var item in allUsers)
            {
                userArray[i++] = item.UserName;
            }
            ViewBag.AllUsers = userArray;

            //var rolesforuser = Roles.GetRolesForUser(UserName);

            //if(rolesforuser != null)
            //{
            //    ViewBag.RolesForThisUser = rolesforuser;
            //}
            SelectList list = new SelectList(Roles.GetAllRoles());
            ViewBag.Roles = list;


            return View("RoleAddToUser");
        }



        private static string ErrorCodeToString(MembershipCreateStatus createStatus)
        {
            // obtener una lista completa de códigos de estado.
            switch (createStatus)
            {
                case MembershipCreateStatus.DuplicateUserName:
                    return "El nombre de usuario ya existe. Escriba un nombre de usuario diferente.";

                case MembershipCreateStatus.DuplicateEmail:
                    return "Ya existe un nombre de usuario para esa dirección de correo electrónico. Escriba una dirección de correo electrónico diferente.";

                case MembershipCreateStatus.InvalidPassword:
                    return "La contraseña especificada no es válida. Escriba un valor de contraseña válido.";

                case MembershipCreateStatus.InvalidEmail:
                    return "La dirección de correo electrónico especificada no es válida. Compruebe el valor e inténtelo de nuevo.";

                case MembershipCreateStatus.InvalidAnswer:
                    return "La respuesta de recuperación de la contraseña especificada no es válida. Compruebe el valor e inténtelo de nuevo.";

                case MembershipCreateStatus.InvalidQuestion:
                    return "La pregunta de recuperación de la contraseña especificada no es válida. Compruebe el valor e inténtelo de nuevo.";

                case MembershipCreateStatus.InvalidUserName:
                    return "El nombre de usuario especificado no es válido. Compruebe el valor e inténtelo de nuevo.";

                case MembershipCreateStatus.ProviderError:
                    return "El proveedor de autenticación devolvió un error. Compruebe los datos especificados e inténtelo de nuevo. Si el problema continúa, póngase en contacto con el administrador del sistema.";

                case MembershipCreateStatus.UserRejected:
                    return "La solicitud de creación de usuario se ha cancelado. Compruebe los datos especificados e inténtelo de nuevo. Si el problema continúa, póngase en contacto con el administrador del sistema.";

                default:
                    return "Error desconocido. Compruebe los datos especificados e inténtelo de nuevo. Si el problema continúa, póngase en contacto con el administrador del sistema.";
            }
        }




    }
}
